package util;

import java.lang.reflect.Array;
import java.lang.reflect.Field;

public class ObjectCloner2 {
    // 克隆方法
    public static <T> T clone(T obj) throws Exception {
        // 获取对象的类类型
        Class<?> clazz = obj.getClass();
        // 创建新的实例
        T clone = (T) clazz.getDeclaredConstructor().newInstance();

        // 获取对象的所有字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);  // 设置字段可访问

            // 判断字段类型
            if(field.getType().isPrimitive() || field.getType().equals(String.class)){
                // 对于基本数据类型和String类型，直接进行赋值
                field.set(clone, field.get(obj));
            } else if (field.getType().isArray()){
                // 对于数组类型，通过Array的copy方法进行深度克隆
                Object arrayObj = field.get(obj);
                int length = Array.getLength(arrayObj);
                Object newArrayObj = Array.newInstance(field.getType().getComponentType(), length);
                System.arraycopy(arrayObj, 0, newArrayObj, 0, length);
                field.set(clone, newArrayObj);
            } else {
                // 对于其他引用类型，递归调用克隆方法进行深度克隆（要求其他引用类型也能实现克隆方法）
                field.set(clone, clone(field.get(obj)));
            }
        }

        return clone;
    }
}